/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package chessapps;

import com.si.entite.Echiquier;
import com.si.entite.Player;
import com.si.entite.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ChessApps extends JPanel implements ActionListener {

    JButton[][] tabButton;
    JButton bouttonSelect;
    Echiquier table;
    Player player;
    boolean premierClique;
    boolean selectionValide;
    ImageIcon emptyImg = new ImageIcon("./src/com/ChessApps/images/vide.gif");
    ImageIcon img = new ImageIcon("./src/com/ChessApps/images/vide.gif");
    String move = "";
    Boolean wrongMove = false;
    Color couleur1= Color.WHITE;
    Color couleur2= Color.DARK_GRAY;

    
    
    public ChessApps(Player p) {
        Color couleurActuelle = couleur1;
        this.setLayout(new GridLayout(8, 8));
        tabButton = new JButton[8][8];
        bouttonSelect = new JButton();//----------enregistrer le boutton selectionné---------
        table = new Echiquier();   //--------création de la table (coté couche metier)
        premierClique = true;
        player = p;
        // je dois creer un joueur ici et faire un getter et setter pour ce joueur. principalement pr la couleur.
        // si le client choisi serveur il sera joueur noir, sinon il sera blanc.
        // et c'est dans chessApps que je devrais controler le deplacement de pieces noir ou blanche

        this.setTable(table);
        //--------------------instanciation des couleurs pour les boutons-----------------
        for (int i = 0; i < 8; i++) {
            tabButton[i][0].setBackground(couleurActuelle);
            for (int j = 1; j < 8; j++) {
                if (couleurActuelle.equals(couleur1)) {
                    tabButton[i][j].setBackground(couleur2);
                    couleurActuelle = couleur2;
                } else {
                    tabButton[i][j].setBackground(couleur1);
                    couleurActuelle = couleur1;
                }
            }
        }
        //-----------------------fin de l'instanciation de la table------------------


        //---------------instanciation de la fenetre et options-------------------

        this.setSize(new Dimension(550, 550));


    }

    public Player getPlayer() {
        return player;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public void setTable(Echiquier table) {
        this.table = table;

        for (int i = 0; i < 8; i++) 
        {
            for (int j = 0; j < 8; j++) 
            {
                tabButton[i][j] = new JButton();
                tabButton[i][j].setName(i + "," + j);
                tabButton[i][j].setPreferredSize(new Dimension(80, 80));
                tabButton[i][j].addActionListener(this);
                img = new ImageIcon("./src/com/ChessApps/images/vide.gif");   //donner a toutes les cases une image vide.
                if (table.get(i, j) != null) 
                {
                    if ("blanc".equals(table.get(i, j).getCouleur())) 
                            {tabButton[i][j].setIcon(new ImageIcon(table.get(i, j).getPathImage(1)));} 
                    else    {tabButton[i][j].setIcon(new ImageIcon(table.get(i, j).getPathImage(2)));}
                }
                this.add(tabButton[i][j]);
            }
        }
    }



    public Echiquier getTable() {
        return table;
    }
    
    
    public Position getPosByButtonName(int i, int j)
    {   
        String[] tabChar = new String[2];
        
        tabChar = this.tabButton[i][j].getName().split(",");
        Position pos = new Position(Integer.parseInt(tabChar[0]), Integer.parseInt(tabChar[1]));
        return pos;
    }
    
    
    public void selectionner(int i, int j)
    {                   
                        if (this.getTable().get(i, j) == null) 
                        {
                            selectionValide = false;
                            return;
                        }
                        else
                        {
                            bouttonSelect = this.tabButton[i][j];
                            // je selectionne la case choisi pour le coté couche metier
                            this.getTable().selectionnee(this.getPosByButtonName(i, j));
                            selectionValide = true;
                            bouttonSelect.setBackground(this.tabButton[i][j].getBackground()); 
                        }
                        
    }
    
    public void deplacement(int i, int j)
    {  //----------------verification du deplacement-------------------------------
            if (this.getTable().deplacer(this.getPosByButtonName(i, j))) 
            {
                 wrongMove= false; //si le deplacement a été accepter, alors wrong move est a faux.
                 //---------definir le mouvement fait dans la variable move----------------------------
                 this.setMove(bouttonSelect.getName() + ":" + this.tabButton[i][j].getName());
                 
                 this.tabButton[i][j].setIcon(bouttonSelect.getIcon());
                 //----------------------enlever l'image de la case qui a été selectionner (bouttonselect est un boutton temporaire)--------------------------------
                            for (int k = 0; k < 8; k++) 
                            {for (int m = 0; m < 8; m++) 
                                {if (this.tabButton[k][m] == bouttonSelect) 
                                    {
                                        this.tabButton[k][m].setIcon(emptyImg);
                                        break;
                                    }
                                }
                            }
              } 
              else 
              { // ----------avertir l'utilisateur que le deplacement est impossible
                 JOptionPane.showMessageDialog(this, "Déplacement impossible\n"+this.getTable().getPosPieceCourante()+" ne peut se deplacer vers "+i+","+j);
                 wrongMove = true;
              }
                     
        }

    @Override
    public void actionPerformed(ActionEvent action) {
        

       
        //------------------action sur la table de jeu------------------------------------
        if (premierClique) {   
            //si c'est le premier clique, alors je parcours la table pr voir quelle est la case
            //et je la sauvegarde dans une case temporaire.
               
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (action.getSource() == this.tabButton[i][j]) 
                    {
                        //verification si le joueur a cliquer sur ses pieces ou non
                        //aussi, si c'est son tour de jouer.
                        if (this.table.get(i,j) != null)
                            if ((this.table.get(i,j).getCouleur().equals(this.getPlayer().getSide()))
                                && this.player.isPlay())
                            {
                                selectionner(i,j);
                                break; 
                            }else 
                            {selectionValide = false;}  
                    }
                }
            }
            premierClique = false;
        } 
        else 
        {   //------------------------deuxiemme clique, donc changement de case niveau graphic et couche metier----------------- 
            if (!selectionValide)  //si aucune piece n'a été selectionnée, alors on ne  
                {
                premierClique = true;
                return;
                }
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (action.getSource() == this.tabButton[i][j]) {
                        if (this.player.isPlay())
                        {   deplacement(i,j);
                            // si le joueur a fait un mouvement impossible, on lui donne la permission de reprendre son coup
                            if(wrongMove)
                            {this.player.setPlay(true);}
                            else
                            {this.player.setPlay(false);
                             bouttonSelect = null;}
                            
                            
                            break;
                        }
                    }
                    

                }
            }


            for (int i = 0; i < 8; i++) 
            {
              for (int j = 0; j < 8; j++) 
                { 
                    if(this.getTable().get(i, j) != null)
                    {
                        System.out.print(""+this.getTable().get(i, j).toString()+",");
                    }else {System.out.print("null,");}
                } System.out.println("\n");
            }
            premierClique = true;

        }
        //-------------------------fin de l'action sur la table de jeu-----------------------------------------   

    
    }
    
    public void changerTheme(Color c1, Color c2) {
        for (int i = 0; i < 8; i++) {
            if ((i % 2) == 0) {
                tabButton[i][0].setBackground(c1);
            } else {
                tabButton[i][0].setBackground(c2);
            }
            for (int j = 1; j < 8; j++) {
                if ((i == 0) & (j % 2) == 0) {
                    tabButton[i][j].setBackground(c1);
                }
                if (((i & 1) == 0) & (j & 1) == 0) {
                    tabButton[i][j].setBackground(c1);
                }
                if (((i & 1) != 0) & (j & 1) != 0) {
                    tabButton[i][j].setBackground(c1);
                } 
                else if (((i & 1) == 0) & (j & 1) != 0) {
                    tabButton[i][j].setBackground(c2);
                }
                else if (((i & 1) != 0) & (j & 1) == 0) {
                    tabButton[i][j].setBackground(c2);
                }
            }
        }
    }

    public String getMove() {
        return move;
    }

    public void setMove(String move) {
        this.move = move;
    }
    
    public JButton getButton(int i,int j)
    {return tabButton[i][j];
    }
    
    public Color getCouleur1() {
        return couleur1;
    }

    public void setCouleur1(Color couleur1) {
        this.couleur1 = couleur1;
    }

    public Color getCouleur2() {
        return couleur2;
    }

    public void setCouleur2(Color couleur2) {
        this.couleur2 = couleur2;
    }
}
